package 传智播客_黑马.java高级.reflect反射;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class GetMethod {

    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Class<Person> c = Person.class;
        Person person = new Person();
//        我们要会如何执行方法：invoke(实例对象，方法参数);没有参数就不写。
//        通过方法名和参数可以定下来是一个唯一的方法（重载方法是：参数不同）

//        获取无参方法
        Method sleep1 = c.getMethod("sleep");
        System.out.println(sleep1);
        sleep1.invoke(person);

//        获取有参方法
        Method sleep2 = c.getMethod("sleep", int.class);
        Method eat1 = c.getDeclaredMethod("sleep");
        System.out.println("eat1 = " + eat1);
        System.out.println(sleep2);
        sleep2.invoke(person, 5);


        Method[] methods = c.getMethods();//会获取到所有的public 方法,同时也会包括父类的一些方法
        Method[] methods1 = c.getDeclaredMethods();//只会获取类的的方法(包括私有)，没有父类的


//      使用 setAccessible()，可以运行添加了private修饰符的方法，它与getDeclaredMethod连用
        Method eat = c.getDeclaredMethod("eat");
        eat.setAccessible(true);
        eat.invoke(person);

        for (Method method : methods) {
            System.out.println("public method = " + method);
        }

        for (Method method : methods1) {
            method.setAccessible(true);
            System.out.println("all method = " + method);
        }

    }
}

